
/// 构造
void main() {
  Point p = Point.builder();

  Rect r = Rect.aa(1, 2);
  r.setHeight = 10;
  int a = r.getHeight;

  Rect2 r2 = Rect2(height: 10,width: 20);

}

//java中写法
// class P {
//   double x;
//   double y;
//
//   P(int x, int y) {
//     this.x = x;
//     this.y = y;
//   }
// }

//重定向构造函数 = java构造连方案
class Point {
  //默认不给与初始值
  // num x;
  num x = 0;
  late num y;
  late num z;

  Point(this.x, this.y,this.z) {
    print("构造函数$x ---  $y");
  }

  // Point(this.x) {
  //   this(x,0);
  // }

  //重定向构造函数，使用冒号调用其他构造函数
  Point.builderToX(num x) : this(x, 0,0);
  Point.builderToY(num y) : this(0, y,0);
  Point.builder() : this(0, 0,0);
}

/// 命名构造 = builder构建器
class Rect {
  late int _height; //定义成私有成员(前面加下划线),私有成员不能被外部直接访问
  late int _width;

  Rect(this._height, this._width); //Dart默认构造函数 只能声明一次,Java可以声明多个
  Rect.heigthSet(this._height); //命名构造函数 可以声明多个
  Rect.widthSet(this._width); //命名构造函数 可以声明多个
  Rect.allSet(this._width, this._height); //命名构造函数 可以声明多个
  Rect.allSet2()
      : _height = 5,
        _width = 5; //带默认参数的构造方法

  Rect.aa(int h,int w){
    this._height = h;
    this._width = w;
  }



  //set get属性方法,外部通过访问属性的形式调用该方法
  set setHeight(int value) {
    _height = value;
  }

  //getter属性方法,不用括号，外部通过访问属性的形式调用该方法
  get getHeight {
    return _height;
  }

  //getter属性方法,不用括号，外部通过访问属性的形式调用该方法
  get Area {
    return _height * _width;
  }

  //定义私有方法
  int _area() {
    return _height * _width;
  }

  int getArea() {
    return _area();
  }

  String getMessage() {
    return ('获取传入的高，宽值：$_height $_width 面积计算为：');
  }
}

//可选参数达到重载效果
class Rect2 {
  late int _height; //定义成私有成员(前面加下划线),私有成员不能被外部直接访问
  late int _width;

  Rect2({int height = 0, int width = 0}) {
    _height = height;
    _width = width;
  }


  //getter属性方法,不用括号，外部通过访问属性的形式调用该方法
  get area {
    return _height * _width;
  }

  //定义私有方法
  int _area() {
    return _height * _width;
  }

  int getArea() {
    return _area();
  }

  String getMessage() {
    return ('获取传入的高，宽值：$_height $_width 面积计算为：');
  }
}